package main

import (
	"fmt"
	"sync"
	"time"
)

type MutexInfo struct {
	mutex sync.Mutex

	infos []int
}

func (m *MutexInfo) addInfo(value int) {

	m.mutex.Lock()

	m.infos = append(m.infos, value)

	m.mutex.Unlock()

}

func main() {
	m := MutexInfo{}
	for i := 0; i < 10; i++ {

		go m.addInfo(i)

	}
	time.Sleep(time.Second * 5)
	fmt.Println(m.infos)
}

/*
3、go语言的线程同步

1）使用互斥锁实现线程同步

互斥锁是最简单的一种锁类型，同时也比较暴力，当一个goroutine获得了锁之后，其他goroutine就只能乖乖等到这个goroutine释放该锁。go语言使用sync.Mutex实现互斥锁。
我们通过多次运行发现，输出的结果并不总是从0到9按顺序输出，说明创建的10个goroutine并不是有序的抢占线程的执行权，也就是说这种同步并不是有序的同步，我们可以让10个goroutine一个一个的同步执行，但是并不能安排执行次序。
运行到这里，假如我们注释掉同步锁的代码为发生什么？
*/
